/*
 * GXT310.c
 *
 *  Created on: 2025年7月4日
 *      Author: 黄少杰
 */



#include "GXT310.h"

#define write 0
#define read  1
float F_value=0;
//char display_String[20]={0};//显示运行数据用的字符串4位整数显示
float Humiture[4];

uint8_t Humiture_buff1[20];
//R_BSP_SoftwareDelay
void I2C_INIT()
{
    I2C_SCL_H;
    I2C_SDA_H;
}






//IIC1  产生起始信号
void I2C_StarT(void)
{
   // I2C_SDA_OUT();

    I2C_SDA_H;
    I2C_SCL_H;
    R_BSP_SoftwareDelay(5,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(5);
    I2C_SDA_L;
    R_BSP_SoftwareDelay(6,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(6);
    I2C_SCL_L;
}


//IIC1 产生停止信号
void I2C_StoP(void)
{
   //I2C_SDA_OUT();

   I2C_SCL_L;
   I2C_SDA_L;
   I2C_SCL_H;
   R_BSP_SoftwareDelay(6,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(6);
   I2C_SDA_H;
   R_BSP_SoftwareDelay(6,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(6);
}

//IIC1 主机产生应答信号ACK
void I2C_Ack(void)
{
   I2C_SCL_L;
   //I2C_SDA_OUT();
   I2C_SDA_L;
   R_BSP_SoftwareDelay(2,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(2);
   I2C_SCL_H;
   R_BSP_SoftwareDelay(5,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(5);
   I2C_SCL_L;
}



//IIC1 主机不产生应答信号NACK
void I2C_NAck(void)
{
   I2C_SCL_L;
   //I2C_SDA_OUT();
   I2C_SDA_H;
   R_BSP_SoftwareDelay(2,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(2);
   I2C_SCL_H;
   R_BSP_SoftwareDelay(5,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(5);
   I2C_SCL_L;
}



//IIC1 等待从机应答信号
//返回值：1 接收应答失败
//        0 接收应答成功
uint8_t I2C_Wait_Ack(void)
{
    uint8_t tempTime=0;

    //I2C_SDA_in();//I2C_SDA_IN();

    I2C_SDA_H;
    R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(1);
    I2C_SCL_H;
    R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(1);

    bsp_io_level_t p_port_value_pin_015;
    R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_15, &p_port_value_pin_015);
    while(p_port_value_pin_015)
    {
        tempTime++;
        R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(1);
        if(tempTime>250)
        {
            I2C_StoP();
            return 1;
        }
    }

    I2C_SCL_L;
    R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(1);
    return 0;
}



//I2C1 发送一个字节
void I2C_Send_Byte(uint8_t txd)
{
    uint8_t i=0;
    //I2C_SDA_OUT();
    I2C_SCL_L;//拉低时钟开始数据传输
    for(i=0;i<8;i++)
    {
        if((txd&0x80)>0) //0x80  1000 0000
        {
            I2C_SDA_H;
        }
        else
        {
            I2C_SDA_L;
        }
        txd<<=1;
        R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(1);
        I2C_SCL_H;
        R_BSP_SoftwareDelay(2,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(2); //发送数据
        I2C_SCL_L;
        R_BSP_SoftwareDelay(2,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(2);
    }
}



//I2C1 读取一个字节
uint8_t I2C_Read_Byte(uint8_t ack)
{
   uint8_t i=0,receive=0;
  // I2C_SDA_in();
   for(i=0;i<8;i++)
   {
    I2C_SCL_L;
    R_BSP_SoftwareDelay(2,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(2);
        I2C_SCL_H;
        //while(!GPIO_ReadInputDataBit(GPIO_I2C,I2C_SCL));
        receive<<=1;
        bsp_io_level_t p_port_value_pin_015;
        R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_15, &p_port_value_pin_015);
        if(p_port_value_pin_015)
        {
           receive++;
        }
        R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_MICROSECONDS);//Delay_us(1);
   }
    if(ack==0)
        I2C_NAck();
    else
        I2C_Ack();
    return receive;
}
float Temperature1=3.14;
void GXT310_read_result1(uint8_t addr)
{
    short tem,hum;
    //u16 tem1[8];
    uint8_t buff[6];
//  float Temperature1[129]={0};
//  float Temperature2=0;
//  float Temperature=0;
    float Humidity=0;


    I2C_StarT();
    I2C_Send_Byte(addr | write);//写7位I2C设备地址加0作为写取位,1为读取位
    I2C_Wait_Ack();
    I2C_Send_Byte(0x00);
    I2C_Wait_Ack();
    //I2C_StoP();

    I2C_StarT();
    I2C_Send_Byte(addr | read);//写7位I2C设备地址加0作为写取位,1为读取位
    if(I2C_Wait_Ack()==0)
    {
        buff[0]=I2C_Read_Byte(1);
        I2C_Send_Byte(0x02);
        buff[1]=I2C_Read_Byte(1);

        I2C_StoP();

    }
    else
    {
    buff[0]=1;
    buff[1]=1;
    I2C_StoP();
    }
//    if(buff[0]&0x80)
//    {
//         tem=(buff[0] << 8) | buff[1] ;
//        hum = (((~tem)>>0)+1);
//    Temperature1=-(float)(hum*0.0078125);
//    }
//    else
//    {
         tem=(buff[0] << 8) | buff[1] ;
    hum = ((tem>>0)+1);
    Temperature1=(float)(hum*0.0078125);
//    }

    tem=0;
    hum=0;

}
